Basic calculator II¶
Time: O(N); Space: O(N); medium
Implement a basic calculator to evaluate a simple expression string.
The expression string contains only: * non-negative integers, * +, -, , / operators and empty spaces.
The integer division should truncate toward zero.
Example 1:
Input: s =“3 + 2 * 2”
Output: 7
Example 2:
Input: s = ” 3/2 “
Output: 1
Example 3:
Input: s = ” 3+5 / 2 “
Output: 5
Notes:
You may assume that the given expression is always valid.
Do not use the eval built-in library function.
[1]:
class Solution1(object):
def compute(self, operands, operators):
left, right = operands.pop(), operands.pop()
op = operators.pop()
if op == '+':
operands.append(left + right)
elif op == '-':
operands.append(left - right)
elif op == '*':
operands.append(left * right)
elif op == '/':
operands.append(left // right)
def calculate(self, s: str) -> int:
"""
:type s: str
:rtype: int
"""
operands, operators = [], []
operand = ""
for i in reversed(range(len(s))):
if s[i].isdigit():
operand += s[i]
if i == 0 or not s[i-1].isdigit():
operands.append(int(operand[::-1]))
operand = ""
elif s[i] == ')' or s[i] == '*' or s[i] == '/':
operators.append(s[i])
elif s[i] == '+' or s[i] == '-':
while operators and \
(operators[-1] == '*' or operators[-1] == '/'):
self.compute(operands, operators)
operators.append(s[i])
elif s[i] == '(':
while operators[-1] != ')':
self.compute(operands, operators)
operators.pop()
while operators:
self.compute(operands, operators)
return operands[-1]
[2]:
sol = Solution1()
s = "3 + 2 * 2"
assert sol.calculate(s) == 7
s = " 3/2 "
assert sol.calculate(s) == 1
s = " 3+5 / 2 "
assert sol.calculate(s) == 5